package com.blog.web.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.blog.common.core.web.page.TableDataInfo;
import com.blog.common.domain.entity.Article;
import com.blog.common.domain.dto.ConditionDto;
import com.blog.common.domain.vo.*;


import java.io.Serializable;
import java.util.List;

/**
 * <p>
 * 文章 服务类
 * </p>
 *
 * @author Valerie
 * @since 2023-02-18
 */
public interface ArticleService extends IService<Article> {

    /**
     * 查看首页文章
     *
     * @return {@link List< ArticleHomeVo>}
     */
    TableDataInfo<ArticleHomeVo> listArticles();

    /**
     * 查看文章归档
     *
     * @return {@link TableDataInfo<ArticlePreviewVoList>}
     */
    TableDataInfo<ArticlePreviewVoList> listArchives();

    /**
     * 根据条件查询文章
     *
     * @param conditionDto
     * @return {@link ArticlePreviewVoList}
     */
    TableDataInfo<ArticlePreviewVoList> listArticlesByCondition(ConditionDto conditionDto);

    /**
     * 根据id查看文章
     *
     * @param articleId
     * @return {@link ArticleVo}
     */
    ArticleVo getArticleById(Serializable articleId);

    /**
     * 点赞文章
     *
     * @param articleId
     * @return void
     */
    void saveArticleLike(Serializable articleId);

    /**
     * 查询最新文章
     *
     * @return {@link List<ArticleVo>}
     */
    List<ArticleVo> listArticlesByCreateTime();

    /**
     * 根据归档时间
     *
     * @param pageSize 条数
     * @return {@link List< ArchiveSideVo>}
     */
    List<ArchiveSideVo> listArchiveDate(Serializable pageSize);

    /**
     * 根据时间过去归档
     *
     * @param archiveDate 时间
     * @return {@link TableDataInfo<ArticlePreviewVoList>}
     */
    TableDataInfo<ArticlePreviewVoList> listArchiveByDate(Serializable archiveDate);

    /**
     * 获取首页推荐文章
     *
     * @return {@link List<ArticleRecommendVo>}
     */
    List<ArticleRecommendVo> listArticleByRecommend();

    /**
     * 归档页查询
     *
     * @return {@link List<ArchivePreviewVoList>}
     */
    List<ArchivePreviewVoList> getArticleByYearAndMonth();

    /**
     * 查询文章
     *
     * @param keywords 关键词
     * @param pageType 是否分页
     *
     * @return {@link TableDataInfo<ArticleSearchVo>}
     */
    TableDataInfo<ArticleSearchVo> listArticlesBySearch(Serializable keywords, Serializable pageType);
}
